package collection;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/**
 * 排序自定义元素的集合:
 * 使用Collections工具类中重载的
 * static void sort(List list,Comparator c)方法
 * 这样就没有代码侵入性，不用再实现Comparable接口，
 * 但是需要添加第二个参数，也就是Comparator接口的匿名内部类中定义比较规则
 *
 * @author XingHaiYang
 * @date 2022/9/29 11:01
 */
public class SortListDemo2 {
    public static void main(String[] args) {
        List<Point> list = new ArrayList<>();
        list.add(new Point(1,1 ));
        list.add(new Point(2,2 ));
        list.add(new Point(3,4));
        list.add(new Point(2, 5));
        list.add(new Point(1, 4));
        System.out.println(list);
        /*
        * compare 比较 comparable 可比较的
        *
        * Collections.sort(List list)
        * 该方法对集合进行自然排序的前提是，该集合中的元素必须实现了接口：Comparable,否则编译不通过
        *
        * 当我们使用上述方法排序某个集合时，若报错，则不使用该方式。
        * 不推荐我们定义的类型作为元素时，为了排序必须实现Comparable接口，因为它对我们的程序造成了侵入性
        *
        * 侵入性：当我们使用某个类提供的方法时，该方法反过来要求我们为其修改其他额外地方的代码，此为侵入性。
        *
        * */
//        Collections.sort(list);
        /*
        * Collections提供了一个重载的sort方法，该方法不要求元素必须实现Comparable接口，
        * 而是在使用sort方法时临时传入一个比较规则，该比较规则类需要实现Comparator接口
        * static void sort(List list,Comparator c)
        * */
        // 比较规则：比较器
        // 比较规则：点到原点的距离长的大
        //如果为正数，说明o1离原点远，值就大，反之，o2大
       /* Comparator<Point> c = new Comparator<Point>() {
            @Override
            public int compare(Point o1, Point o2) {

                int len1 = o1.getX()*o1.getX()+o1.getY()*o1.getY();
                int len2 = o2.getX()*o2.getX()+o2.getY()*o2.getY();
                return len1-len2;
            }
        };
        Collections.sort(list,c);
        System.out.println(list);
*/
        // 下面为简化版,将比较器当成参数直接传进去,之后也是用这种模式排序
        Collections.sort(list,new Comparator<Point>() {
            @Override
            public int compare(Point o1, Point o2) {
                // 比较规则：点到原点的距离长的大
                int len1 = o1.getX()*o1.getX()+o1.getY()*o1.getY();
                int len2 = o2.getX()*o2.getX()+o2.getY()*o2.getY();
                return len1-len2;//如果为正数，说明o1离原点远，值就大，反之，o2大
            }
        });
        System.out.println(list);
    }
}
